#include "opewidget.h"
#include "tcpclient.h"

OpeWidget::OpeWidget(QWidget *parent) : QWidget(parent)
{

    m_pTextEditTE = new QTextEdit("显示所有操作日志");//显示操作日志
    m_pTextCursor = new QTextCursor(m_pTextEditTE->document());//光标, 用于从起始处显示操作变量, 配合QTextEdit* m_pTextEditTE;使用


    p_teHBL = new QHBoxLayout;
    p_teHBL->addWidget(m_pTextEditTE);


    m_pListw = new QListWidget(this);
    friend_listWidget_item = new QListWidgetItem("好友 >");
    friend_listWidget_item->setTextAlignment(Qt::AlignHCenter);
    book_listWidget_item = new QListWidgetItem("图书 >");
    book_listWidget_item->setTextAlignment(Qt::AlignHCenter);
    msgadd_listWidget_item = new QListWidgetItem("通知 >");
    msgadd_listWidget_item->setTextAlignment(Qt::AlignHCenter);

    m_pListw->addItem(friend_listWidget_item);
    m_pListw->addItem(book_listWidget_item);
    m_pListw->addItem(msgadd_listWidget_item);




    m_pFriend = &Friend::getInstance();
    m_pBook = &Book::getInstance();
    m_pMsgAdd = &MsgAdd::getInstance();

    //测试
//    m_pMsgAdd->addMsgWidget();
//    m_pMsgAdd->addMsgWidget();
//    m_pMsgAdd->addMsgWidget("张三");
//    m_pMsgAdd->addMsgWidget("李四");


    //打印日志绑定按钮
    //按钮m_pShowOnlineUsrPB
    connect(m_pFriend, &Friend::signal_m_pShowOnlineUsrPB_clicked, this, &OpeWidget::slot_Friend_signals_showOnlinePBslot);
    //按钮m_pSearchUsrPB
    connect(m_pFriend, &Friend::signal_m_pSearchUsrPB_clicked, this, &OpeWidget::slot_Friend_signals_showOnlinePBslot);

    //MesAdd类中通知的按钮打印日志
    connect(m_pMsgAdd, &MsgAdd::signal_m_pAddFriendAgree_clicked, this, &OpeWidget::slot_MsgAdd_signals_showOnlinePBslot);



    //把friend框和book框和MsgAdd通知框添加到stackedwidget中
    m_pSW = new QStackedWidget;
    m_pSW->addWidget(m_pFriend);
    m_pSW->addWidget(m_pBook);
    m_pSW->addWidget(m_pMsgAdd);


    pMain = new QHBoxLayout;
    pMain->addWidget(m_pListw);//标题
    pMain->addWidget(m_pSW);//好友框图书框

    pAll = new QVBoxLayout;
    pAll->addLayout(p_teHBL);
    pAll->addLayout(pMain);

    setLayout(pAll);

    //m_pListw发出currentRowChanged信号, 后面的好友框和图书框进行切换
    connect(m_pListw, &QListWidget::currentRowChanged, m_pSW, &QStackedWidget::setCurrentIndex);
    connect(m_pListw, &QListWidget::currentRowChanged,
            [=](){
                    if(m_pListw->currentRow() == 2)
                    {
                        qcout << "阅读了通知";
                        msgadd_listWidget_item->setBackground(Qt::white);//来消息就显示红色, 处理完消息就不显示颜色
                    }

                }
            );

    //当前页设置为通知页
//    m_pListw->setCurrentRow(2);


    //TcpClient类
    connect(&TcpClient::getInstance(), &TcpClient::signal_slot_sendToServerPB_m_pShowOnlineUsrPB, this, &OpeWidget::slot_TcpClient_signal_slot_sendToServerPBOnline);


    resize(1000, 600);
}

//单例模式, 产生静态的一个操作界面, 应用程序程序只产生这一个操作界面
OpeWidget &OpeWidget::getInstance()
{
    static OpeWidget instance;
    return instance;
}

//从m_pTextEditTE控件的起始处插入日志输出
void OpeWidget::m_setText(QString str)
{
    m_pTextCursor->movePosition(QTextCursor::Start);//光标回到TextEdit的起始位置
    m_pTextCursor->insertText(str);//输入文本
    m_pTextCursor->insertText("\n");//加一个换行符

    //#include <QTextCursor>

    //// 假设你已经有了一个 QTextEdit 的实例，名为 textEdit
    //QTextEdit *textEdit = new QTextEdit();

    //// 创建一个 QTextCursor 对象
    //QTextCursor cursor(textEdit->document());

    //// 将光标移动到文档的开始位置
    //cursor.movePosition(QTextCursor::Start);

    //// 在光标当前位置插入文本
    //cursor.insertText("这是要插入的文本");
}

//有消息从服务器发过来
void OpeWidget::haveMsgFromServer(const PDU *pdu)
{
    qcout << "准备更新通知";
    switch(pdu->uiMsgType)
    {
    case ENUM_MSG_TYPE_ADD_FRIEND_REQUEST_WAIT:
    {
        qcout << "来好友请求消息了";
        msgadd_listWidget_item->setBackground(Qt::red);//来消息就显示红色, 处理完消息就不显示颜色
        //让MsgAdd添加控件处理
        m_pMsgAdd->addMsgWidget(pdu);

        break;
    }
    }
}

//有消息从服务器发过来, 同意
void OpeWidget::haveMsgFromServer_agree(const PDU *pdu)
{
    qcout << "同意通知";
    switch(pdu->uiMsgType)
    {
    case ENUM_MSG_TYPE_ADD_FRIEND_RESPOND_AGREE:
    {
        qcout << "来好友消息了, 同意";
        msgadd_listWidget_item->setBackground(Qt::red);//来消息就显示红色, 处理完消息就不显示颜色
        //让MsgAdd添加控件处理
        m_pMsgAdd->addMsgWidget_Agree(pdu);

        break;
    }
    }
}
//有消息从服务器发过来, 拒绝的消息
void OpeWidget::haveMsgFromServer_refuse(const PDU *pdu)
{
    qcout << "拒绝通知";
    switch(pdu->uiMsgType)
    {
    case ENUM_MSG_TYPE_ADD_FRIEND_RESPOND_REFUSE:
    {
        qcout << "来好友消息了, 拒绝";
        msgadd_listWidget_item->setBackground(Qt::red);//来消息就显示红色, 处理完消息就不显示颜色
        //让MsgAdd添加控件处理
        m_pMsgAdd->addMsgWidget_Refuse(pdu);

        break;
    }
    }
}

//Friend类发送来的信号, 处理客户端按下显示在线用户按钮
void OpeWidget::slot_Friend_signals_showOnlinePBslot(enum ENUM_PUSHBUTTON_TYPE e, QString text)
{

    switch(e)
    {
    case ENUM_FRIEND_PUSHBUTTON_m_pShowOnlineUsrPB:
        //按钮m_pShowOnlineUsrPB
        this->m_setText("用户按下了" + text + "按钮");
        break;
    case ENUM_FRIEND_PUSHBUTTON_m_pSearchUsrPB:
        //按钮m_pSearchUsrPB
        this->m_setText("用户按下了" + text + "按钮");
        break;

    default:
        break;
    }

}

//TcpClient类发来的信号
void OpeWidget::slot_TcpClient_signal_slot_sendToServerPBOnline()
{
    qcout << "slot_TcpClient_signal_slot_sendToServerPBOnline";
    this->m_setText("客户端向服务器发送了查询所有在线用户的请求");
}

//MsgAdd类打算输出日志
void OpeWidget::slot_MsgAdd_signals_showOnlinePBslot(QString logStr)
{
    this->m_setText(logStr);

}

//把MsgAdd标签变为无色, 取消消息提醒
void OpeWidget::slot_cancleMsgAdd()
{
    qcout << "选中并执行, 把标签变为白色背景";
    msgadd_listWidget_item->setBackground(Qt::white);//来消息就显示红色, 处理完消息就不显示颜色
}




